home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / arpcmd.c < prev    next >
C/C++ Source or Header  |  1994-07-11  |  4KB  |  208 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9. #include <ctype.h>
  10. #ifdef    UNIX
  11. #undef    toupper
  12. #undef    tolower
  13. #endif
  14.  
  15. extern char badhost[];
  16. extern char nospace[];
  17.  
  18. int doarpadd(),doarpdrop();
  19. struct cmds arpcmds[] = {
  20.     "add", doarpadd, 4,
  21.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  22.     "arp add failed",
  23.  
  24.     "drop", doarpdrop, 3,
  25.     "arp drop <hostid> ether|ax25|netrom",
  26.     "not in table",
  27.  
  28.     "publish", doarpadd, 4,
  29.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  30.     "arp add failed",
  31.  
  32.     NULLCHAR, NULLFP, 0,
  33.     "arp subcommands: add, drop, publish",
  34.     NULLCHAR, 
  35. };
  36. char *arptypes[] = {
  37.     "NET/ROM",
  38.     "10 Mb Ethernet",
  39.     "3 Mb Ethernet",
  40.     "AX.25",
  41.     "Pronet",
  42.     "Chaos",
  43.     "Arcnet",
  44.     "Appletalk"
  45. };
  46.  
  47. int
  48. doarp(argc,argv)
  49. int argc;
  50. char *argv[];
  51. {
  52.     if(argc < 2){
  53.         dumparp();
  54.         return 0;
  55.     }
  56.     return subcmd(arpcmds,argc,argv);
  57. }
  58. static
  59. doarpadd(argc,argv)
  60. int argc;
  61. char *argv[];
  62. {
  63.     int16 hwalen,hardware,naddr;
  64.     int32 addr,resolve();
  65.     char *hwaddr;
  66.     struct arp_tab *ap;
  67.     struct arp_type *at;
  68.     void arp_drop();
  69.     int pub = 0;
  70.  
  71.     if(argv[0][0] == 'p')    /* Is this entry published? */
  72.         pub = 1;
  73.     if((addr = resolve(argv[1])) == 0){
  74.         printf(badhost,argv[1]);
  75.         return 1;
  76.     }
  77.     /* This is a kludge. It really ought to be table driven */
  78.     switch(tolower(argv[2][0])){
  79.     case 'n':    /* Net/Rom pseudo-type */
  80.         hardware = ARP_NETROM;
  81.         naddr = argc - 3 ;
  82.         if (naddr != 1) {
  83.             printf("No digipeaters in NET/ROM arp entries - ") ;
  84.             printf("use netrom route add\n") ;
  85.             return 1 ;
  86.         }
  87.         break;
  88.     case 'e':    /* "ether" */
  89.         hardware = ARP_ETHER;
  90.         naddr = 1;
  91.         break;        
  92.     case 'a':    /* "ax25" */
  93.         hardware = ARP_AX25;
  94.         naddr = argc - 3;
  95.         break;
  96.     case 'm':    /* "mac appletalk" */
  97.         hardware = ARP_APPLETALK;
  98.         naddr = 1;
  99.         break;
  100.     default:
  101.         printf("unknown hardware type \"%s\"\n",argv[2]);
  102.         return -1;
  103.     }
  104.     /* If an entry already exists, clear it */
  105.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  106.         arp_drop(ap);
  107.  
  108.     at = &arp_type[hardware];
  109.     if(at->scan == NULLFP){
  110.         printf("Attach device first\n");
  111.         return 1;
  112.     }
  113.     /* Allocate buffer for hardware address and fill with remaining args */
  114.     hwalen = at->hwalen * naddr;
  115.     if((hwaddr = malloc(hwalen)) == NULLCHAR){
  116.         printf(nospace);
  117.         return 0;
  118.     }
  119.     /* Destination address */
  120.     (*at->scan)(hwaddr,&argv[3],argc - 3);
  121.     ap = arp_add(addr,hardware,hwaddr,hwalen,pub);    /* Put in table */
  122.     free(hwaddr);                    /* Clean up */
  123.     stop_timer(&ap->timer);            /* Make entry permanent */
  124.     ap->timer.count = ap->timer.start = 0;
  125.     return 0;
  126. }
  127. /* Remove an ARP entry */
  128. /*ARGSUSED*/
  129. static
  130. doarpdrop(argc,argv)
  131. int argc;
  132. char *argv[];
  133. {
  134.     int16 hardware;
  135.     int32 addr,resolve();
  136.     struct arp_tab *ap;
  137.     void arp_drop();
  138.  
  139.     if((addr = resolve(argv[1])) == 0){
  140.         printf(badhost,argv[1]);
  141.         return 1;
  142.     }
  143.     /* This is a kludge. It really ought to be table driven */
  144.     switch(tolower(argv[2][0])){
  145.     case 'n':
  146.         hardware = ARP_NETROM;
  147.         break;
  148.     case 'e':    /* "ether" */
  149.         hardware = ARP_ETHER;
  150.         break;        
  151.     case 'a':    /* "ax25" */
  152.         hardware = ARP_AX25;
  153.         break;
  154.     case 'm':    /* "mac appletalk" */
  155.         hardware = ARP_APPLETALK;
  156.         break;
  157.     default:
  158.         hardware = 0;
  159.         break;
  160.     }
  161.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  162.         return -1;
  163.     arp_drop(ap);
  164.     return 0;    
  165. }
  166. /* Dump ARP table */
  167. static
  168. dumparp()
  169. {
  170.     register int i;
  171.     extern struct arp_stat arp_stat;
  172.     register struct arp_tab *ap;
  173.     char e[128];
  174.     char *inet_ntoa();
  175.     extern char *arptypes[];
  176.  
  177.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  178.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  179.      arp_stat.replies,arp_stat.outreq);
  180.  
  181.     printf("IP addr         Type           Time Q Addr\n");
  182.     for(i=0;i<ARPSIZE;i++){
  183.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  184.             printf("%-16s",inet_ntoa(ap->ip_addr));
  185.             printf("%-15s",arptypes[ap->hardware]);
  186.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  187.             if(ap->state == ARP_PENDING)
  188.                 printf("%-2u",len_q(ap->pending));
  189.             else
  190.                 printf("  ");
  191.             if(ap->state == ARP_VALID){
  192.                 if(arp_type[ap->hardware].format != NULLFP){
  193.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  194.                 } else {
  195.                     e[0] = '\0';
  196.                 }
  197.                 printf("%s",e);
  198.             } else {
  199.                 printf("[unknown]");
  200.             }
  201.             if(ap->pub)
  202.                 printf(" (published)");
  203.             printf("\n");
  204.         }
  205.     }
  206.     return 0;
  207. }
  208.